package main

import "fmt"

func main() {
	fmt.Println("8. 数组和切片")

	// 数组
	fmt.Println("\n--- 数组 ---")

	// 声明和初始化数组
	var arr1 [5]int // 默认零值
	fmt.Printf("arr1: %v, 长度: %d\n", arr1, len(arr1))

	// 指定数组元素
	arr2 := [5]int{1, 2, 3, 4, 5}
	fmt.Printf("arr2: %v, 长度: %d\n", arr2, len(arr2))

	// 让编译器计算数组长度
	arr3 := [...]int{10, 20, 30}
	fmt.Printf("arr3: %v, 长度: %d\n", arr3, len(arr3))

	// 指定索引初始化数组
	arr4 := [5]int{0: 100, 4: 200}
	fmt.Printf("arr4: %v, 长度: %d\n", arr4, len(arr4))

	// 访问和修改数组元素
	fmt.Printf("arr2[0]: %d\n", arr2[0])
	arr2[0] = 100
	fmt.Printf("修改后 arr2[0]: %d\n", arr2[0])

	// 遍历数组
	fmt.Println("遍历 arr2:")
	for i, v := range arr2 {
		fmt.Printf("arr2[%d] = %d\n", i, v)
	}

	// 数组是值类型，赋值会复制整个数组
	arr5 := arr2
	arr5[0] = 999
	fmt.Printf("原数组 arr2: %v\n", arr2)
	fmt.Printf("赋值数组 arr5: %v\n", arr5)

	// 多维数组
	var matrix [2][3]int
	matrix[0][0] = 1
	matrix[0][1] = 2
	matrix[0][2] = 3
	matrix[1][0] = 4
	matrix[1][1] = 5
	matrix[1][2] = 6
	fmt.Printf("二维数组 matrix: %v\n", matrix)

	// 切片
	fmt.Println("\n--- 切片 ---")

	// 从数组创建切片
	slice1 := arr2[1:4] // 从索引1到索引3（不包括4）
	fmt.Printf("slice1 (arr2[1:4]): %v, 长度: %d, 容量: %d\n", slice1, len(slice1), cap(slice1))

	// 从数组创建切片（省略开始索引）
	slice2 := arr2[:3] // 从开始到索引2
	fmt.Printf("slice2 (arr2[:3]): %v, 长度: %d, 容量: %d\n", slice2, len(slice2), cap(slice2))

	// 从数组创建切片（省略结束索引）
	slice3 := arr2[2:] // 从索引2到末尾
	fmt.Printf("slice3 (arr2[2:]): %v, 长度: %d, 容量: %d\n", slice3, len(slice3), cap(slice3))

	// 创建切片（make函数）
	slice4 := make([]int, 5) // 长度为5的切片
	fmt.Printf("slice4 (make([]int, 5)): %v, 长度: %d, 容量: %d\n", slice4, len(slice4), cap(slice4))

	slice5 := make([]int, 3, 10) // 长度为3，容量为10的切片
	fmt.Printf("slice5 (make([]int, 3, 10)): %v, 长度: %d, 容量: %d\n", slice5, len(slice5), cap(slice5))

	// 直接创建切片
	slice6 := []int{1, 2, 3, 4, 5}
	fmt.Printf("slice6: %v, 长度: %d, 容量: %d\n", slice6, len(slice6), cap(slice6))

	// 切片是引用类型
	slice7 := slice6
	slice7[0] = 999
	fmt.Printf("原切片 slice6: %v\n", slice6)
	fmt.Printf("引用切片 slice7: %v\n", slice7)

	// 向切片添加元素
	slice8 := []int{1, 2, 3}
	fmt.Printf("slice8: %v, 长度: %d, 容量: %d\n", slice8, len(slice8), cap(slice8))

	slice8 = append(slice8, 4)
	fmt.Printf("添加一个元素后 slice8: %v, 长度: %d, 容量: %d\n", slice8, len(slice8), cap(slice8))

	slice8 = append(slice8, 5, 6, 7)
	fmt.Printf("添加多个元素后 slice8: %v, 长度: %d, 容量: %d\n", slice8, len(slice8), cap(slice8))

	// 合并切片
	slice9 := []int{8, 9, 10}
	slice8 = append(slice8, slice9...)
	fmt.Printf("合并切片后 slice8: %v, 长度: %d, 容量: %d\n", slice8, len(slice8), cap(slice8))

	// 切片的复制
	slice10 := make([]int, len(slice8))
	copy(slice10, slice8)
	fmt.Printf("复制后的 slice10: %v, 长度: %d, 容量: %d\n", slice10, len(slice10), cap(slice10))

	// 切片的截取
	slice11 := slice10[2:5]
	fmt.Printf("slice10[2:5]: %v, 长度: %d, 容量: %d\n", slice11, len(slice11), cap(slice11))

	// 遍历切片
	fmt.Println("遍历 slice10:")
	for i, v := range slice10 {
		fmt.Printf("slice10[%d] = %d\n", i, v)
	}

	// 空切片
	var slice12 []int // nil切片
	fmt.Printf("nil切片 slice12: %v, 长度: %d, 容量: %d, 是否为nil: %t\n", slice12, len(slice12), cap(slice12), slice12 == nil)

	slice13 := []int{} // 空切片
	fmt.Printf("空切片 slice13: %v, 长度: %d, 容量: %d, 是否为nil: %t\n", slice13, len(slice13), cap(slice13), slice13 == nil)
}
